home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / apps / 123 / vcsrc / lex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-05-10  |  8.5 KB  |  348 lines

  1. /*    SC    A Spreadsheet Calculator 
  2.  *        Lexical analyser 
  3.  *
  4.  *        original by James Gosling, September 1982 
  5.  *        modifications by Mark Weiser and Bruce Israel, 
  6.  *            University of Maryland 
  7.  *
  8.  *              More mods Robert Bond, 12/86 
  9.  *        Major mods to run on VMS and AMIGA, 1/17/87 
  10.  *
  11.  */ 
  12.  
  13.  
  14.  
  15. #include "sc.h" 
  16. #include <ctype.h> 
  17. #ifdef VMS 
  18. #include "y_tab.h" 
  19. #else 
  20. #ifdef TOS 
  21. #include "y_tab.h" 
  22. #else 
  23. #include "y.tab.h" 
  24. #endif 
  25. #endif 
  26.  
  27. extern char *malloc(); 
  28. char *strtof(); 
  29.  
  30. struct key { 
  31.     char *key; 
  32.     int val; 
  33. }; 
  34.  
  35. struct key experres[] = { 
  36. #include "experres.h" 
  37.     0, 0}; 
  38.  
  39. struct key statres[] = { 
  40. #include "statres.h" 
  41.     0, 0}; 
  42.  
  43. #define ctl(x) ('x'&037) 
  44.  
  45. yylex () { 
  46.     register char *p = line+linelim; 
  47.     int ret = -1; 
  48.     while (isspace(*p)) p++; 
  49.     if (*p==0) ret = -1; 
  50.     else if (isalpha(*p)) { 
  51.     char *tokenst = p; 
  52.     register tokenl; 
  53.     register struct key *tbl; 
  54.     while (isalpha(*p)) p++; 
  55.     if (p-tokenst <= 2) { /* a COL is 1 or 2 char alpha */ 
  56.         register  col; 
  57.         ret = COL; 
  58.         col = ((tokenst[0] & 0137) - 'A'); 
  59.         if (p == tokenst+2) 
  60.         col = (col + 1)*26 + ((tokenst[1] & 0137) - 'A'); 
  61.         yylval.ival =  col; 
  62.     } else { 
  63.         ret = WORD; 
  64.         tokenl = p-tokenst; 
  65.         for (tbl = linelim ? experres : statres; tbl->key; tbl++) 
  66.             if (((tbl->key[0]^tokenst[0])&0137)==0 
  67.              && tbl->key[tokenl]==0) { 
  68.             register i = 1; 
  69.             while (i<tokenl && ((tokenst[i]^tbl->key[i])&0137)==0) 
  70.                 i++; 
  71.             if (i>=tokenl) { 
  72.                 ret = tbl->val; 
  73.                 break; 
  74.             } 
  75.             } 
  76.         if (ret==WORD) { 
  77.         linelim = p-line; 
  78.         yyerror ("Unintelligible word"); 
  79.         } 
  80.     } 
  81.     } else if ((*p == '.') || isdigit(*p)) { 
  82.     register long v = 0; 
  83.     char *nstart = p; 
  84.     if (*p != '.') { 
  85.         do v = v*10 + (*p-'0'); 
  86.         while (isdigit(*++p)); 
  87.     } 
  88.     if (*p=='.' || *p == 'e' || *p == 'E') { 
  89.         ret = FNUMBER; 
  90.         p = strtof(nstart, &yylval.fval); 
  91.     } else { 
  92.             if((int)v != v) 
  93.             { 
  94.                 ret = FNUMBER; 
  95.                 yylval.fval = v; 
  96.             } 
  97.             else 
  98.             { 
  99.  
  100.                 ret = NUMBER; 
  101.                 yylval.ival = v; 
  102.             } 
  103.     } 
  104.     } else if (*p=='"') { 
  105.     /* This storage is never freed.  Oh well.  -MDW */ 
  106.     char *ptr; 
  107.         ptr = p+1; 
  108.         while(*ptr && *ptr++ != '"'); 
  109.         ptr = (char *)malloc((unsigned)(ptr-p)); 
  110.     yylval.sval = ptr; 
  111.     p += 1; 
  112.     while (*p && *p!='"') *ptr++ = *p++; 
  113.     *ptr = 0; 
  114.     if (*p) p += 1; 
  115.     ret = STRING; 
  116.     } else if (*p=='[') { 
  117.     while (*p && *p!=']') p++; 
  118.     if (*p) p++; 
  119.     linelim = p-line; 
  120.     return yylex(); 
  121.     } else ret = *p++; 
  122.     linelim = p-line; 
  123.     return ret; 
  124.  
  125. #define N_KEY 26 
  126.  
  127. struct key_map { 
  128.     char *k_str; 
  129.     char k_val; 
  130.     char k_index; 
  131. }; 
  132.  
  133. struct key_map km[N_KEY]; 
  134.  
  135. initkbd() 
  136.     int i; 
  137.  
  138.     /* cursor set mode */ 
  139.     km[0].k_str  = "\033OD"; km[0].k_val  = ctl(b); 
  140.     km[1].k_str  = "\033OC"; km[1].k_val  = ctl(f); 
  141.     km[2].k_str  = "\033OA"; km[2].k_val  = ctl(p); 
  142.     km[3].k_str  = "\033OB"; km[3].k_val  = ctl(n); 
  143.     /* cursor reset mode */ 
  144.     km[4].k_str  = "\033[D"; km[4].k_val  = ctl(b); 
  145.     km[5].k_str  = "\033[C"; km[5].k_val  = ctl(f); 
  146.     km[6].k_str  = "\033[A"; km[6].k_val  = ctl(p); 
  147.     km[7].k_str  = "\033[B"; km[7].k_val  = ctl(n); 
  148.     /* CSI arrows */ 
  149.     km[8].k_str  = "\233D";  km[8].k_val  = ctl(b); 
  150.     km[9].k_str  = "\233C";  km[9].k_val  = ctl(f); 
  151.     km[10].k_str = "\233A";  km[10].k_val = ctl(p); 
  152.     km[11].k_str = "\233B";  km[11].k_val = ctl(n); 
  153.     /* application keypad mode */ 
  154.     km[12].k_str = "\033Op"; km[12].k_val = '0'; 
  155.     km[13].k_str = "\033Oq"; km[13].k_val = '1'; 
  156.     km[14].k_str = "\033Or"; km[14].k_val = '2'; 
  157.     km[15].k_str = "\033Os"; km[15].k_val = '3'; 
  158.     km[16].k_str = "\033Ot"; km[16].k_val = '4'; 
  159.     km[17].k_str = "\033Ou"; km[17].k_val = '5'; 
  160.     km[18].k_str = "\033Ov"; km[18].k_val = '6'; 
  161.     km[19].k_str = "\033Ow"; km[19].k_val = '7'; 
  162.     km[20].k_str = "\033Ox"; km[20].k_val = '8'; 
  163.     km[21].k_str = "\033Oy"; km[21].k_val = '9'; 
  164.     km[22].k_str = "\033Om"; km[22].k_val = '-'; 
  165.     km[23].k_str = "\033Ol"; km[23].k_val = ','; 
  166.     km[24].k_str = "\033On"; km[24].k_val = '.'; 
  167.     km[25].k_str = "\033OM"; km[25].k_val = ctl(m); 
  168.  
  169. nmgetch() 
  170.     register int c; 
  171.     register struct key_map *kp; 
  172.     register struct key_map *biggest; 
  173.     register int i; 
  174.     int almost; 
  175.     int maybe; 
  176.  
  177.     static char dumpbuf[10]; 
  178.     static char *dumpindex; 
  179.  
  180.     void timeout(); 
  181.  
  182.     if (dumpindex && *dumpindex) 
  183.         return (*dumpindex++); 
  184.  
  185.     c = ttgetc(); 
  186.     biggest = 0; 
  187.     almost = 0; 
  188.  
  189.     for (kp = &km[0]; kp < &km[N_KEY]; kp++) { 
  190.     if (!kp->k_str) 
  191.         continue; 
  192.     if (c == (kp->k_str[kp->k_index] & 0xFF)) { 
  193.         almost = 1; 
  194.         kp->k_index++; 
  195.         if (kp->k_str[kp->k_index] == 0) { 
  196.         c = kp->k_val; 
  197.                    for (kp = &km[0]; kp < &km[N_KEY]; kp++) 
  198.                 kp->k_index = 0; 
  199.             return(c); 
  200.         } 
  201.     } 
  202.     if (!biggest && kp->k_index) 
  203.         biggest = kp; 
  204.         else if (kp->k_index && biggest->k_index < kp->k_index) 
  205.         biggest = kp; 
  206.     } 
  207.  
  208.     if (almost) return(nmgetch()); 
  209.  
  210.     if (biggest) { 
  211.     for (i = 0; i<biggest->k_index; i++) 
  212.         dumpbuf[i] = biggest->k_str[i]; 
  213.     dumpbuf[i++] = c; 
  214.     dumpbuf[i] = 0; 
  215.     dumpindex = &dumpbuf[1]; 
  216.            for (kp = &km[0]; kp < &km[N_KEY]; kp++) 
  217.         kp->k_index = 0; 
  218.     return (dumpbuf[0]); 
  219.     } 
  220.  
  221.     return(c); 
  222.  
  223.  
  224. int dbline; 
  225.  
  226. debug (fmt, a, b, c) { 
  227.     move(2+(dbline++%22),80-60); 
  228.     printw(fmt,a,b,c); 
  229.     clrtoeol(); 
  230.  
  231. /* 
  232.  * This converts a floating point number of the form 
  233.  * [s]ddd[.d*][esd*]  where s can be a + or - and e is E or e. 
  234.  * to floating point. 
  235.  * p is advanced. 
  236.  */ 
  237.  
  238. char *
  239. strtof(p, res) 
  240. register char *p; 
  241. double *res; 
  242.     double acc; 
  243.     int sign; 
  244.     double fpos; 
  245.     int exp; 
  246.     int exps; 
  247.  
  248.     acc = 0.0; 
  249.     sign = 1; 
  250.     exp = 0; 
  251.     exps = 1; 
  252.     if (*p == '+') 
  253.         p++; 
  254.     else if (*p == '-') { 
  255.         p++; 
  256.         sign = -1; 
  257.     } 
  258.     while (isdigit(*p)) { 
  259.         acc = acc * 10.0 + (double)(*p - '0'); 
  260.         p++; 
  261.     } 
  262.     if (*p == 'e' || *p == 'E') { 
  263.         p++; 
  264.         if (*p == '+') 
  265.         p++; 
  266.         else if (*p == '-') { 
  267.         p++; 
  268.         exps = -1; 
  269.         } 
  270.         while(isdigit(*p)) { 
  271.         exp = exp * 10 + (*p - '0'); 
  272.         p++; 
  273.         } 
  274.     } 
  275.     if (*p == '.') { 
  276.     fpos = 1.0/10.0; 
  277.     p++; 
  278.     while(isdigit(*p)) { 
  279.         acc += (*p - '0') * fpos; 
  280.         fpos *= 1.0/10.0; 
  281.         p++; 
  282.     } 
  283.     } 
  284.     if (*p == 'e' || *p == 'E') { 
  285.     exp = 0; 
  286.     exps = 1; 
  287.         p++; 
  288.     if (*p == '+') 
  289.         p++; 
  290.     else if (*p == '-') { 
  291.         p++; 
  292.         exps = -1; 
  293.     } 
  294.     while(isdigit(*p)) { 
  295.         exp = exp * 10 + (*p - '0'); 
  296.         p++; 
  297.     } 
  298.     } 
  299.     if (exp) { 
  300.     if (exps > 0) 
  301.         while (exp--) 
  302.         acc *= 10.0; 
  303.     else 
  304.         while (exp--) 
  305.         acc *= 1.0/10.0; 
  306.     } 
  307.     if (sign > 0) 
  308.         *res = acc; 
  309.     else 
  310.     *res = -acc; 
  311.  
  312.     return(p); 
  313.  
  314. help () { 
  315.     move(2,0); 
  316.     clrtobot(); 
  317.     dbline = 0; 
  318.     debug ("                 Cursor cmds:"); 
  319.     debug ("  ^n j next row       ^p k prev. row      ^g erase cmd"); 
  320.     debug ("  ^f l fwd col        ^b h back col       ^r redraw screen"); 
  321.     debug ("   0 $ first, end col"); 
  322.     debug ("                 Cell cmds:"); 
  323.     debug (" \" < > enter label       = enter value     x clear cell"); 
  324.     debug ("     c copy cell         m mark cell      ^t line 1 on/off");  
  325.     debug ("    ^a type value       ^e type expr.     ^v type vbl name"); 
  326.     debug ("                 Row, Column cmds:"); 
  327.     debug (" ar ac dup           ir ic insert      sr sc show"); 
  328.     debug (" dr dc delete        zr zc hide        pr pc pull"); 
  329.     debug (" vr vc value only        f format"); 
  330.     debug ("                 File cmds:"); 
  331.     debug ("     G get database      M merge database  T write tbl fmt"); 
  332.     debug ("     P put database      W write listing"); 
  333.     debug ("                 Misc. cmds:"); 
  334.     debug (" ^c, q quit              / copy region    pm pull (merge)"); 
  335.     debug ("                 Expression Operators"); 
  336.     debug ("  +-*/ arithmetic     ?e:e conditional   & | booleans"); 
  337.     debug (" < = > relations     <= >= relations      != relations"); 
  338.     debug ("       @sum(v1:v2)         @avg(v1:v2)       @prod(v1:v2)"); 
  339.